package com.heima.user.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dtos.LoginDto;
import com.heima.model.user.pojo.ApUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.service.ApUserService;
import com.heima.utils.common.AppJwtUtil;
import com.heima.utils.common.BCrypt;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements ApUserService {

    /**
     * 登录接口
     *   二合一，用户登录也是有游客登录
     * @param dto
     * @return
     */
    @Override
    public ResponseResult login(LoginDto dto) {
        //1.判断是游客登录还是用户登录,通过判断dto是否有数据实现
        if (StrUtil.isBlank(dto.getPassword()) && StrUtil.isBlank(dto.getPhone())){
            //2.游客登录后续
            //2.1使用0生成jwt并返回
            String token = AppJwtUtil.getToken(0L);
            Map<String,Object> map = new HashMap<>();
            map.put("token",token);
            return ResponseResult.okResult(map);

        }
        //3.用户登录后续
        ApUser user = this.lambdaQuery().eq(ApUser::getPhone, dto.getPhone()).one();
        //3.1判断是否用户存在
        if (user==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
        }
        //3.2判断密码是否正确
        boolean checkpw = BCrypt.checkpw(dto.getPassword(), user.getPassword());
        if (!checkpw){
            return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
        }
        //3.3生成jwt令牌
        String token = AppJwtUtil.getToken(Long.valueOf(user.getId()));

        //组装数据
        Map<String,Object> map = new HashMap<>();
        map.put("token",token);

        Map<String,Object> userMap = new HashMap<>();
        userMap.put("id",user.getId());
        userMap.put("name",user.getName());
        userMap.put("phone",user.getPhone());

        map.put("user",userMap);
        //3.4返回数据
        return ResponseResult.okResult(map);
    }

    /**
     * 根据用户id获取用户实体
     *
     * @param userId
     * @return
     */
    @Override
    public ResponseResult<ApUser>findUserById(Integer userId) {
        ApUser apUser = getById(userId);
        return ResponseResult.okResult(apUser);
    }
}
